package bean.dao;



import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import dominio.Cliente;
import dominio.Domicilio;


import dominio.SolicitudCotizacion;




public class HibernateClienteDAO {
	
	private static HibernateClienteDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static HibernateClienteDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateClienteDAO();
		} 
		return instancia;
	}
	
	private Session getSession(){
		if(session == null)
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session != null) session.close();
	}
	
	
	public void agregarCliente(Cliente cli){
		Session s=getSession();
		s.beginTransaction();
		s.persist(cli);
		s.flush();
		s.getTransaction().commit();
		
	}
	
	
	
	public String getUltimoId (){
		Session s=getSession();
		String o=(String) s.createQuery("select max(cli.idCliente) from Cliente cli").uniqueResult();
		return o;
		
		
	}
	
	
	
	public void eliminarCliente (Cliente cli){
			Session s=getSession();
			s.beginTransaction();
			s.delete(cli);
			s.flush();
			s.getTransaction().commit();
	}
	
	
	public Cliente loadCliente(Cliente cli){
		Session s=this.getSession();
		
		s.load(cli, cli.getIdCliente());
		return cli;
		
	}
	
	
	
	
@SuppressWarnings("unchecked")
public List<Cliente> listarClientes(){
	
	Session s = this.getSession();
	List<Cliente> lista= s.createQuery("from Cliente").list();
	return lista;
}
	
	public void modificarCliente (String idCliente , String razonSocial, String calle,String numero,String piso,String departamento,String localidad,String telefono){
		Session s= getSession();
		s.beginTransaction();
		Cliente cli=new Cliente();
		cli.setIdCliente(idCliente);
		cli.setRazonSocial(razonSocial);
		cli.setTelefono(telefono);
		Domicilio dom= new Domicilio();
		dom.setCalle(calle);
		dom.setDepartamento(departamento);
		dom.setLocalidad(localidad);
		dom.setNumero(numero);
		dom.setPiso(piso);
		cli.setDomicilio(dom);
		s.update(cli);  
		s.flush();
		s.getTransaction().commit();
	}
	

	@SuppressWarnings("unchecked")
	public List<String> listaId(){
		Session s=getSession();
		List<String> lista=s.createQuery("select cli.idCliente from Cliente cli").list();
		s.clear();
		return lista;
	}
	
	
	public Cliente buscarCliente(String id){
		Session s= getSession();
		Cliente cli=(Cliente) s.getNamedQuery("imprimir cliente").setString("id", id).uniqueResult();
		s.clear();
		return cli;
		
	}
	
	

	
	
	
	public String imprimirCliente(String id){
		Session s= getSession();
		
		Cliente cli= (Cliente) s.getNamedQuery("imprimir cliente").setString("id", id).uniqueResult();
		
		String str;
		if(cli!=null){
		
		 str= "numero de cliente: "+cli.getIdCliente()+"\nrazon social: "+cli.getRazonSocial()+"\ncalle: "+
						cli.getDomicilio().getCalle()+"\nnumero: "+cli.getDomicilio().getNumero()+"\npiso: "+
						cli.getDomicilio().getPiso()+"\ndepartamento: "+cli.getDomicilio().getDepartamento()+"\nlocalidad: "+
						cli.getDomicilio().getLocalidad()+"telefono: "+cli.getTelefono();
		}
		
		else
			str=null;
			
		s.clear();
		return str;
		
		
	}
	
	
	
	  /******************************requerimiento numero 1 ***************************************************/
	
	
	
	public boolean esCliente(String id){
		Session s= getSession();
		Cliente cli=(Cliente) s.getNamedQuery("imprimir cliente").setString("id", id).uniqueResult();
		if(cli!=null)
		return true;
		else
			return false;
	}
	
	
	
	public boolean coincideIdRz(String id ,String RazonSocial){
		Session s = getSession();
		Object o = s.getNamedQuery("coincideIdRz").setString("id", id).setString("rz", RazonSocial).uniqueResult();
		if(o==null)
			return false;
		else
			return true;
	}
	
	public boolean existeNs(String ns){
		Session s= sf.openSession();
		Object o= s.getNamedQuery("existeNs").setString("ns", ns).uniqueResult();
		if(o==null)
			return false;
		else
			return true;
		
	}
}
